<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2019/1/15
 * Time: 23:05
 */
namespace app\admin\logic;
use app\common\model\zbtask\Import;
use app\common\model\zbtask\Money;
use app\common\model\zbtask\Order;
use app\common\model\zbtask\Rate;
use think\Db;
use app\common\library\task\ImportService;
use think\exception\ValidateException;


/**
 * 打款上层服务
 */
class DelLogic
{

    private static $new; //申请一个私有的静态成员变量来保存该类的唯一实例
    private function __construct() {
    }


    public static function instance () { //声明一个静态公共方法，供外部获取唯一实例
        if (!(self::$new instanceof self)) {
            self::$new = new self;
        }
        return self::$new;
    }

    /**
     * 删除任务 只有众包费 未打款就就可以删除
     * @param  object $task
     */
    public function task($task) {
        $where['task_id'] = $task['id'];
        $where['status'] = 1;
        $where['transfer_type'] = 2;
        //先判断 任务是否能删除 任务下面的任务的众包费 如果已经打款 那么就不能删除 如果未打款那么就 可以删除
        $count = Money::where($where)->count();
        if ($count > 0) {
            throw new ValidateException('该任务已经有订单已经打款，不能删除，请联系管理员');
        }

        $moneys =Money::all(['task_id' => $task['id']]);
        $ids = Money::where(['task_id' => $task['id']])->column('id');
        foreach ($moneys as $v) {
            $this->taskMoney($v['id'], true);
            //重构税率 排除要删除的数据
            ImportService::instance()->delReRate($v, $ids);
        }

        //删除改任务所有预导入数据
        Import::where(['task_id'=> $task['id']])->delete();
        return true;
    }

    /**
     * 删除众包费
     * @param $id 众包费id
     */
    public function taskMoney($id, $task = false) {
        //删除众包费
        $row = Money::get($id);
        if (!$row) {
            throw new ValidateException('数据不存在');
        }
        if ($row['transfer_type'] == 2) {
            throw new ValidateException('打款成功的众包费不能删除');
        }
        //上层做一下事务处理
        try {
            //删除订单
            Order::destroy($row['order_id']);
            //删除税率
            Rate::destroy(['task_money_id' => $row['id']]);
            if ($task == true) {
                $row->delete();
            }
            //删除众包费
        }catch (\Exception $e) {
            throw new ValidateException($e->getMessage());
        }

        return true;
    }

    /**
     * 删除订单 上层做事务处理
     * @param int $orderId 订单ID
     */
    public function order($orderId) {
        //如果订单 未结算可以删除
        $order = Order::get($orderId);
        if(!$order) {
            throw new ValidateException('该订单数据错误');
        }

        //如果订单已结算并且打款 那么久不能删除订单
        $money = Money::get(['order_id'=> $order['id']]);
        if ($money) {
            if ($money['transfer_type'] == 2) {
                throw new ValidateException('该订单已经打款，请联系管理员');
            }

            $money->delete();//删除众包费

            Rate::destroy(['task_money_id' => $money['id']]);//删除税率
            //重构税率 排除要删除的数据
            ImportService::instance()->delReRate($money, $money['id']);
        }
    }
    private function __clone() {} //声明私有的克隆方法，防止对象被克隆

    public function __sleep() { //重写__sleep方法，将返回置空，防止序列化反序列化获得新的对象
        return [];
    }

}